package refleftiontestdome;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionTestDemo {
    public static void reflectNewInstance(){
        try {
            // 获取 Class 对象
            Class<?> c = Class.forName("refleftiontestdome.Student");
            // 通过 Class 对象，去调用 Class 类的方法
            // newInstance ：将获取到引用指向的对象实例化
            Student student = (Student) c.newInstance();
            System.out.println(student);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public static void reflectPrivateConstructor() {
        try {
            // 获取 Class 对象
            Class<?> c = Class.forName("refleftiontestdome.Student");
            // 获取 指定的构造方法，
            // 注意！ 我们使用 getDeclaredConstructor 方法，公有 和 私有的构造方法都可以获取
            // 只要 参数的类型是符合条件的，就能获取。
            Constructor<?> constructor =c.getDeclaredConstructor(String.class,int.class);
            constructor.setAccessible(true);
            Student student = (Student) constructor.newInstance("vip",22);
            System.out.println(student);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void reflectPrivateField() {
        try {
            // 获取 Class 对象
            Class<?>  c = Class.forName("refleftiontestdome.Student");
            // 属性肯定是要借助对象才能访问的。
            Student student = (Student) c.newInstance();
            // 获取 指定的属性
            Field field = c.getDeclaredField("name");
            field.setAccessible(true);
            field.set(student,"张飞");
            System.out.println(student);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void reflectPrivateMethod() {
        // 获取 Class 对象
        try {
            Class<?> c  =  Class.forName("refleftiontestdome.Student");
            Student student = (Student) c.newInstance();
            Method method = c.getDeclaredMethod("function", String.class);
            method.setAccessible(true);
            method.invoke(student,"I am your friends");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        reflectPrivateMethod();
//        reflectPrivateField();
//        reflectPrivateConstructor();
//        reflectNewInstance();
    }
}
